package com.selftool.bo;

import com.selftool.log.Logger;

import java.sql.*;

/**
 * @program: selftool
 * @description: sqllist数据库连接对象
 * @author: CYQ
 * @create: 2024-02-27 09:35
 **/
public class BaseDao {
    // 数据库文件存放位置
    private static String dbFilePath = null;

    // 单例模式
    private static BaseDao db = null;

    private BaseDao() {
    }

    public static BaseDao getDB() {
        if (db == null) {
            dbFilePath = System.getProperty("user.dir") +"/resources/sql.db";
            synchronized (new Object()) {
                if (db == null) {
                    db = new BaseDao();
                }
            }
        }
        return db;
    }

    Connection conn = null; // 連接對象
    Statement stat = null; // 執行對象
    ResultSet resu = null; // 結果集

    static {
        // 1. 加载驱动
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 拿到數據庫連接
     *
     * @throws SQLException SQL錯誤異常
     * @time 2023-6-14 23:08:09
     */
    public void getConnection() throws SQLException {
        // 2. 拿到连接
        conn = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
    }

    /**
     * 拿到Statement對象
     *
     * @throws SQLException SQL錯誤異常
     * @time 2023-6-14 23:07:51
     */
    public void getStatement() throws SQLException {
        // 3. 拿到Statement对象
        if (conn == null || conn.isClosed()) {
            getConnection();
        }

        stat = conn.createStatement();
    }

    /**
     * 執行SQL查詢語句
     *
     * @param sql SQL查詢語句
     * @return 查詢結果對象
     * @throws SQLException SQL錯誤異常
     * @time 2023-6-14 23:07:23
     */
    public ResultSet executeQuery(String sql) throws SQLException {
        // 4. 执行SQL语句拿到结果
        if (stat == null || stat.isClosed()) {
            getStatement();
        }

        Logger.info("执行的SQL语句：" + sql);

        resu = stat.executeQuery(sql);
        return resu;
    }

    /**
     * 執行更改數據庫的語句（插入、更新、刪除、修改表等）
     *
     * @param sql SQL語句
     * @return 影響的行數
     * @throws SQLException SQL錯誤異常
     * @time 2023-6-14 23:06:24
     */
    public int executeUpdate(String sql) throws SQLException {
        // 4. 执行SQL语句拿到结果
        if (stat == null || stat.isClosed()) {
            getStatement();
        }

        Logger.info("执行的SQL语句：" + sql);

        return stat.executeUpdate(sql);
    }

    /**
     * 關閉連接
     *
     * @time 2023-6-14 23:06:00
     */
    public void close() {
        // 6.关掉连接
        try {
            if (resu != null && !resu.isClosed()) {
                resu.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (stat != null && !stat.isClosed()) {
                stat.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
